home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1990-12-11 | 4.6 KB | 104 lines |
- DEFINITION MODULE ResCtrl;
-
- FROM SYSTEM IMPORT BYTE, WORD;
-
- FROM MOSGlobals IMPORT MemArea;
-
- (*
- * Dies Modul bietet Funktionen für Systemmodule, die Ressourcen verwalten
- * und sich dazu Sys-Funktionen bedienen (und mit $Y+ übersetzt werden).
- *
- * Problemerläuterung:
- * Ein Systemmodul, das 'Sys'-Funktionen bietet oder globale bzw. externe
- * Variablen oder Ressourcen kontrolliert (z.B. Interrupts) sollte sich selbst
- * auch der Sys-Funktionen bedienen.
- * Beispielsweise kann ein Modul im Modulkörper Speicher mit SysAlloc
- * anfordern oder einen Systemvektor des TOS verändern. Wird das Modul
- * nicht mehr gebraucht und aus dem Speicher entfernt, muß natürlich der
- * Speicher zurückgegeben bzw. der Vektor restauriert werden. Würde man
- * das mit Hilfe der Funktion 'PrgCtrl.CatchProcessTerm' tun, würde es
- * normalerweise funktionieren.
- * Das Problem entsteht erst, wenn das Modul, das dieses Systemmodul im-
- * portiert, sich resident macht. Wenn der Prozeß dann endet, wird ja
- * der vom Systemmodul geforderte 'CatchProcessTerm' aktiv und das
- * Systemmodul würde seine Ressourcen schließen. Das darf es dann aber
- * noch gar nicht, weil es ja noch resident bleibt und weiterhin von
- * anderen Modulen benötigt wird.
- * Aus diesem Grund gibt es hier die Funktion 'CatchRemoval', die,
- * entgegen 'CatchProcessTerm', das Modul erst dann informiert, wenn
- * es nicht mehr benötigt, sprich importiert, wird.
- *
- * Deshalb ist immer dann, wenn man daran denkt, 'CatchProcessTerm' zu
- * verwenden, zu prüfen, ob nicht der oben beschriebene Fall eintreten
- * kann und dann stattdessen 'CatchRemoval' einzusetzen ist.
- * Als Faustregel gilt:
- * - 'CatchRemoval' für Freigabe von Sys-Ressourcen bei Ressource-
- * verwaltenden Modulen.
- * - 'CatchProcessTerm' bei Hauptmodulen (denn hier hat das Modul
- * ja selbst die Kontrolle darüber, wann es sich resident macht
- * und wieder freigibt) und Freigabe von Ressourcen des untersten
- * Levels bei Ressource-verwaltenden Modulen (ergänzend zu den
- * "Envelopes").
- *)
-
- TYPE RemovalCarrier = ARRAY [0..15] OF WORD;
-
- PROCEDURE CatchRemoval ( VAR hdl: RemovalCarrier; info: PROC; wsp: MemArea );
- (*
- * Meldet eine Prozedur an, die aufgerufen wird, wenn das Modul,
- * das die Prozedur enthält, nicht mehr benötigt wird und aus dem
- * Speicher entfernt werden kann.
- *
- * 'wsp' ist der Stack, der 'info' beim Aufruf zugeteilt wird. 'wsp.bottom'
- * darf NIL sein, dann wird der normale Programm-Stack verwendet.
- *
- * Diese Funktion (und nicht etwa 'CatchProcessTerm') ist deshalb
- * das exakte Gegenstück zum Aufruf des Modulkörpers.
- *
- * Dies ist der Fall, wenn
- * a) das Modul in einem Programm eingelinkt ist und das Programm
- * normal beendet;
- * b) das Modul durch einen Import vom Loader (also durch Load-Time
- * Link) dazugeladen und gestartet wurde und nun wieder freigegeben
- * werden kann, da der Prozeß wieder endet;
- * c) das Modul von einem Modul importiert wird, das sich mit
- * 'ModCtrl.InstallModule' resident gemacht hatte und nach
- * einem Aufruf von 'ReleaseModule', wie unter b), entfert wird.
- *
- * Wird ein Modul lediglich vom Loader (mittels 'LoadModule') geladen,
- * aber nicht aufgerufen, zählt das entsprechende Ausladen des Moduls
- * nicht zu den obigen Fällen. Vielmehr wird bei geladenen Modulen
- * so verfahren, als wenn das Modul jedesmal neu geladen und wieder
- * entladen wird.
- *
- * Somit ist diese Funktion dann zu verwenden, wenn ein Modul Ressourcen
- * dynamisch bei seiner Initialisierung öffnet, die genau dann wieder
- * geschlossen werden dürfen, wenn das Modul nicht mehr benötigt wird.
- * Normalerweise könnte man das dann mit 'PrgCtrl.CatchProcessTerm'
- * bewerkstelligen. Nur ist es dann nicht möglich, das Modul in Pro-
- * grammen zu verwenden, die sich mit 'InstallModule' resident machen.
- *
- * Wird also z.B. in einem Modul im Körper Speicher angefordert, sollte
- * dieser mit der Sys-Funktion (SysAlloc) angefordert werden und über
- * 'CatchRemoval' der Speicher wieder freigegeben werden.
- *
- * WICHTIG: Das benutzende Modul muß mit der Directive "$Y+" übersetzt
- * werden!
- *)
-
- PROCEDURE Resident (): BOOLEAN;
- (*
- * Liefert TRUE, wenn der akt. Prozeß z.Zt. resident ist.
- * Es ist zu beachten, daß dieser Zustand nicht im Modulkörper schon
- * ermittelt werden soll, da das Hauptmodul, das sich evtl. resident
- * macht, dies erst später durchführen kann.
- *)
-
-
- PROCEDURE Private ( n: CARDINAL; VAR d: ARRAY OF BYTE );
- (*
- * interne Systemfunktion
- *)
-
- END ResCtrl.
-